//
//  AppUtils.h
//  habit
//
//  Created by huck on 15-9-1.
//  Copyright (c) 2015年 custom. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreText/CoreText.h>
#import "DSLogger.h"
#import "AppColor.h"
#import "Toast.h"
#import "DateUtil.h"
#import "UIColor+RGB.h"
#import "Macro.h"
#import "ServerMng.h"
#import "UIViewExt.h"
#import "BaseNavigationController.h"

@class AppDelegate;
@class  MainViewController;
@class DDMenuController;
@class UserInfoViewController;

@interface AppUtils : NSObject


/**
 * 获取当前登录用户
 */
+ (LoginDataItem *)loginUser;

/**
 *  是否登出
 */
+ (BOOL)isLogout;

/**
 *  是否登入
 */
+(BOOL)isLogin;

/**
 * 获取ddmenu的leftController
 */
+ (UserInfoViewController *)getLeftViewController;

/**
 * 获取ddmenu
 */
+ (DDMenuController *)getDDMenuViewController;

/**
 * 显示或隐藏leftController
 */
+ (void)showLeftViewController:(BOOL)show;

/**
 * 获取mainViewControoler
 */
+ (MainViewController *)getmainViewController;

/**
 * 获取根导航控制器
 */
+ (BaseNavigationController *)getRootNavigationController;

/**
 * 获取AppDelegate
 */
+ (AppDelegate *)getAppDelegate;

/**
 * 当前应用版本
 */
+ (NSString *)currentVersion;

/**
 * 当前应用build号版本
 */
+ (NSInteger)currentBuildVersion;
/**
 * 获取当前视图
 */
+ (UIViewController *)currentViewController;
/**
 * 获取当前视图
 */
+ (UIView *)currentView;

/**
 * 获取NavigationController
 */
+ (UINavigationController *)getNavigationController;

/**
 * 是否为系统表情输入模式
 */
+ (BOOL)isEmojiInputMode;

/**
 * 过滤掉emoji字符
 */
+ (NSString *)disableEmoji:(NSString *)text;

/**
 * 判断字符串是否为空
 */
+ (BOOL)isEmpty:(NSString *)value;

/**
 * 判断字符串是否为非空
 */
+ (BOOL)isNotEmpty:(NSString *)value;

/**
 * 判断数组是否为空
 */
+ (BOOL)isEmptyArray:(NSArray *)values;

/**
 * 判断数组是否为非空
 */
+ (BOOL)isNotEmptyArray:(NSArray *)values;

/**
 * 判断是否为全数字
 */
+ (BOOL)isNumeric:(NSString *)value;

/**
 * 判断是否为简单的手机号码（11位数字）
 */
+ (BOOL)isPhoneNumber:(NSString *)value;

/**
 * 判断小数点后几位，最长数字是几位的
 */
+ (BOOL)checkNum:(NSString *)value maxLen:(NSUInteger)len afterPointMax:(NSUInteger)after;

/**
 * 判断是否为全字母
 */
+ (BOOL)isAlpha:(NSString *)value;

/**
 * 是否为弱密码(少于8位的纯数字或少于8位的纯字母)
 */
+ (BOOL)isWeakPassword:(NSString *)value;

/**
 *  比较两个字符串是否相等
 *
 *  @param string
 *  @param another
 *
 *  @return 
 */
+ (BOOL)equals:(NSString *)string another:(NSString *)another;

/**
 * 去掉字符串空格
 */
+ (NSString *)trim:(NSString *)value;

/**
 * 截取指定长度(字符)的字符串
 */
+ (NSString *)cutString:(NSString *)value len:(NSInteger)len;

/**
 * MD5加密
 */
+ (NSString *)md5:(NSString *)value;

/**
 * 获取字符个数，一个中文算一个长度，两个英文算一个长度
 */
+ (NSUInteger)length:(NSString *)value;
/**
 * 获取字符个数，一个中文算二个长度，计算字符的数量
 */
+ (NSUInteger)lengthCharacter:(NSString *)value;
/**
 * 编码字符串
 */
+ (NSString *)encodeURL:(NSString *)value;

/**
 * 解码字符串
 */
+ (NSString *)decodeURL:(NSString *)value;

/**
 * 获取URL参数
 */
+ (NSString *)urlParam:(NSString *)url withKey:(NSString *)key;

/**
 * 将JSON字符串转成对象
 */
+ (id)parseJSON:(NSString *)value;

/**
 * 将对象转成JSON字符串
 */
+ (NSString *)toJSONString:(id)object;

/**
 * 获取唯一的UUID，返回32位字符串
 */
+ (NSString *)getUUID;

/**
 * 是否已连接到网络
 */
+ (BOOL)hasConnected;

/**
 * 是否已连接到网络
 */
+ (BOOL)hasConnected:(BOOL)showErrorMsg;

/**
 * 获取当前网络类型
 */
+ (NetType)getNetWorkType;

/**
 *  在当前导航控制器中删除指定的controll
 *
 *  @param targetControllre
 */
+ (void)popController:(UIViewController *)targetControllre;


/**
 *  跳转到指定页面(跳转后的页面，返回直接返回到首页)
 *
 *  @param from
 *  @param to
 *  @param selectedIndex 跳转后并选定选项卡(selectedIndex:[0,1,2,3])
 */
+ (void)jump:(UIViewController *)from to:(UIViewController *)to selectedIndex:(NSUInteger)selectedIndex;

/**
 *  跳转第一个出现after的控制器后面(跳转后的页面，返回直接返回到after的页面)
 *
 *  @param navigation
 *  @param to
 *  @param selectedIndex 跳转后并选定选项卡(selectedIndex:[0,1,2,3])
 */
+ (void)jump:(UINavigationController *)navigation to:(UIViewController *)to after:(Class)after selectedIndex:(NSUInteger)selectedIndex;

/**
 * 页面返回
 */
+ (void)backtoController:(Class)to;

/**
 * 往前找页面
 */
+ (UIViewController *)findBackForController:(Class)target;

/**
 * 设置返回按钮样式,防止导航标题不居中
 */
+ (void)setBackButtonStyle:(UIViewController *)controller;

/**
 * 将按钮的图片和文字居中
 *
 * @param button
 * @param spacing 按钮和文字间距
 */
+ (void)centerButtonContent:(UIButton *)button spacing:(int)spacing;

/**
 * 获取搜索框中的输入框
 */
+ (UITextField *)getSearchBarTextField:(UISearchBar *)searchBar;

/**
 * 设置搜索框中的取消按钮样式
 */
+ (UIButton *)setSearchBarButtonStyle:(UISearchBar *)searchBar;

/**
 * 设置自定义的导航标题 ,目前的导航标题在 MainUIStyleMng 中设置
 */
+ (void)setCustomTitleView:(NSString *)title;

//设置table cell选中背景色
+(void)setTableViewCellSelectBg:(UITableViewCell*)cell;

//设置table cell选中背景色
+(void)setTableViewCellSelectBg:(UITableViewCell*)cell color:(UIColor*)color;

/**
 * 获取没有数据的单元格
 */
+ (UITableViewCell *)getEmptyTableCell:(NSString *)message color:(UIColor *)color;

+ (UITableViewCell *)getEmptyTableCell:(NSString *)message color:(UIColor *)color inCenter:(BOOL)isCenter;

+ (UITableViewCell *)getEmptyTableCell:(NSString *)message;

/**
 * 设置搜索无结果样式
 */
+ (void)setSearchNoResult:(UISearchDisplayController *)controller message:(NSString *)message;

/**
 * 生成分割线，默认颜色
 */
+ (CALayer *)addSeparatorLine:(UIView *)view frame:(CGRect)frame;
/**
 * 生成分割线,指定颜色
 */
+ (CALayer *)addSeparatorLine:(UIView *)view frame:(CGRect)frame color:(UIColor *)color;
/**
 * 将id类型数据转成字符串
 */
+ (NSString *)toString:(id)value;

/**
 * 将id类型数据转成字符串(如果为空，则用replaceValue替换)
 */
+ (NSString *)toString:(id)value replaceValue:(NSString *)replaceValue;

/**
 * 将NSInteger转成字符串
 */
+ (NSString *)toStr:(NSInteger)value;

/**
 * 将id类型转成int类型
 */
+ (NSInteger)toInteger:(id)value;

/**
 * offset~range-offset的随机数
 */
+ (NSInteger)randomInt:(NSUInteger)range offset:(NSInteger)offset;

/**
 * 0~range-1的随机数
 */
+ (NSInteger)randomInt:(NSUInteger)range;

/**
 * 将字符串转位十六进制编码
 */
+ (NSString *)toHexString:(NSData *)value;
/**
 * 将十六进制编码转化字符串
 */
+ (NSData *)stringToHexData:(NSString *)hexString ;
/**
 * 解析链接地址参数
 */
+ (NSString *)getQueryString:(NSString *)url paramName:(NSString *)paramName;

/**
 * 异步执行方法
 */
+ (void)dispatchAsync:(void (^)(id))handle complection:(void (^)(id))completion object:(id)object;

/**
 * 延时执行
 */
+ (void)delay:(void(^)(void))completion delayTime:(NSTimeInterval)delayTime;

/**
 * 延时0.2秒执行
 */
+ (void)delay:(void (^)(void))completion;

/**
 * 显示视图的边框
 */
+ (void)showViewBorder:(UIView *)view;

/**
 * 是否滚动到顶部
 */
+ (BOOL)isScrollToTop:(UIScrollView *)scrollView;

/**
 * 是否滚动到底部
 */
+ (BOOL)isScrollToBottom:(UIScrollView *)scrollView;

/**
 * 在状态栏上显示网络指示标记
 */
+ (void)showNetworkActivityIndicator;

/**
 * 在状态栏上隐藏网络指示标记
 */
+ (void)hideNetworkActivityIndicator;

/**
 * 定时器对象置空
 */
+ (void)invalidateTimer:(NSTimer *)timer;

/**
 * 通知中心增加通知
 */
+ (void)addObserver:(id)observer selector:(SEL)selector name:(NSString *)name;

/**
 * 通知中心移除通知
 */
+ (void)removeObserver:(id)observer name:(NSString *)name;

/**
 * 发通知
 */
+ (void)postNotificationName:(NSString *)name;

+ (void)postNotificationName:(NSString *)name object:(id)object;

+ (void)postNotificationName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;
/**
 * 获取当前对象的类名
 */
+ (NSString *)getClassName:(id)object;

/**
 * 按照指定字符串分割字符串
 */
+(NSArray *) SplitStringToArray:(NSString *)strText separator:(NSString *)strSeparator;

+ (UIView *)ShowWaitView:(UIView *) pParentView wait:(BOOL)bWait;

+ (void)HideWaitView:(UIView *) pWaitView;

/**
 * nsarry 对象进行排序 descriptor对象中的排序字段 ascending 升序
 */
+ (NSArray *)sortArray:(NSArray *) array descriptor:(NSString*)descriptor ascending:(BOOL)ascending;

/**
 * 移动数组元素到指定位置
 */
+ (NSMutableArray *)move:(NSArray *) array sourceIndex:(NSUInteger)sourceIndex destIndex:(NSUInteger)destIndex;

/**
 * 递归容器内所有元素，将 NSArray 转换为 NSMutableArray, 将 NSDictionary 转换为 NSMutableDictionary
 */
+ (id)mutableContainer:(id)container;

/**
 * 提醒时间 6：00，7：00，8：00  的字符串进行排序
 */
+ (NSString *)sortRemindTime:(NSString *) remindTime;

//读文件内容，临时读取自定义json数据用
+ (NSString *)getFileText:(NSString*)filrname;

/**
 * 获取效果文字的属性
 */
+ (NSDictionary *)getTextDrawAttribute:(CGFloat)fontSize color:(UIColor*)textColor;

/**
 *  设置静态显示textView的内容的行间距,其他字号，颜色等属性更随textview原本的属性
 */
+ (void)setTextViewLineSpace:(UITextView *)textView space:(NSUInteger)lineSpace;

/**
 *  设置UIPickerView 去掉内部的分割线
 */
+ (void)setPickerViewStyle:(UIView *)pickerView;

/**
 * textView滚动到底部
 */
+(void)textViewScrollToBottom:(UITextView *)textView;
/**
 * textView滚动到顶部
 */
+(void)textViewScrollToTop:(UITextView *)textView;

/**
 *  加dict作为元素的数组，用各个dict中的指定key的值组成的字符串数组
 */
+(NSArray *)joinArrayDict:(NSArray *)array WithKey:(NSString *)key;

/**
 * 将字符串的数组组装成字符创，指定符号隔开
 */
+(NSString *)joinArray:(NSArray *)array withSeparate:(NSString *)separateStr;

/**
 * 将字符串的数组组装成字符串，逗号隔开
 */
+(NSString *)joinArray:(NSArray *)array;

/**
 * 逗号隔开的字符串(qqq,www,ee,rr,tt)中移除指定的串(qqq,ee),
 */
+(NSString *)removeString:(NSString *)str fromString:(NSString *)string;

/**
 *  追加字符串，逗号隔开，但会结果字符串
 */
+(NSString *)appendString:(NSString *)oldStr withString:(NSString *)appendStr;

/**
 *  数组去重
 */
+(NSArray *)removeDuplicateremoveArr:(NSArray *)array;

/**
 * 获取文本的宽度和高度
 */
+ (CGSize)getTextSize:(NSString *)content font:(UIFont *)font maxSize:(CGSize)maxSize;

/**
 * 计算字体的高宽；
 */
+(CGSize)fontWithString:(NSString *)str fontSize:(CGFloat)font  maxSize:(CGSize )size;

/**
 * 计算文字在多行label中的size；
 */
+(CGSize)labelSizeWithString:(NSString *)str font:(UIFont *)font  maxSize:(CGSize )size;


/**
 * 设置状态栏；
 */
+(void)showStatusBar:(BOOL)show needAnimation:(BOOL)needAnimation;

/**
 * 增加导航按钮
 */
+ (UIBarButtonItem *)addBarButton:(UIViewController *)controller title:(NSString *)title action:(SEL)action position:(PositionType)position;
/**
 * 增加导航图片按钮
 */
+ (UIBarButtonItem *)addBarButton:(UIViewController *)controller image:(UIImage*)image action:(SEL)action position:(PositionType)position;
/**
 * 增加导航按钮
 */
+ (UIBarButtonItem *)addBarButton:(UIViewController *)controller title:(NSString *)title action:(SEL)action position:(PositionType)position fontSize:(CGFloat)size;

/**
 *  弹框显示错误信息
 */
+ (void)showErrorAlert:(NSString *)title;

/**
 *  弹框显示错误信息,确认退出，是否要掉退出接口
 */
+ (void)showErrorAlertToLogin:(NSString *)title needRequest:(BOOL)needRequest;

/**
 *  被踢提示
 */
+ (void)showErrorAlertByKick;

/**
 *  设置导航栏样式-通用
 */
+(void) setNavigationBarStyle;

/**
 *  微调导航栏样式-主要是背景色
 */
+(void) modifyNavigationBarStyle;

/**
 * 获取灰态图片
 */
+ (UIImage*)grayImage:(UIImage*)image;

/**
 * 设置通用按钮的阴影样式
 */
+ (void)setButtonShadowStyle:(UIButton *)btn;

/**
 *  检查更新
 */
+(void)checkAppUpdate;

/**
 *  随机4位数验证码
 */
+(NSString *)createRandomNumber;

/**
 *  设置父 ViewController
 */
+ (void)attachSuperController:(UIViewController *)superCtrl subCtrl:(UIViewController *)subCtrl superView:(UIView *)superView;

//清空子类view
+ (void)clearSubView:(UIView *)view;


/**
 * 设置图片
 */
+ (void )setImage:(UIImageView *)imageView url:(NSString*)url;

+ (void )setImage:(UIImageView *)imageView url:(NSString*)url placeholder:(NSString*)defaultImgName;
/**
 * 设置图片,如果图片尺寸不规则,就取中间的方形图片
 */
+ (void )setImage:(UIImageView *)imageView url:(NSString*)url cutSize:(BOOL)cutCenterImage;

///**
// * 工程类型
// */
//+ (NSString *)getProjectTypeName:(ProjectType)type;

/**
*获取对应水质等级的颜色
*/
+(UIColor *)getQualityClass:(NSString *)waterQualityClassName;

/**
 *获取对应水质等级名称 01-06
 */
+(NSString *)getQualityClassName:(NSString *)waterQualityClassName;

/**
 *一点一策的view创建
 */
+ (UIView *)addReasonView:(CGRect)frame title:(NSString *)title reasonLabel:(NSString *)reasonLabel resonDetail:(NSString *)detail showDetail:(BOOL)showDetail target:(id)target selector:(SEL)sel;
/**
 *巡查状态 0,1,2等待整改 整改中 整改完成
 */
+ (NSString *)getScoutStatusStr:(ScoutStatus)scoutStatus;

/**
 * 打开图片选择器(从ActionSheet菜单中选择，ipad下无法打卡(ios8))
 */
+ (void)openImagePicker:(id)controller sourceType:(UIImagePickerControllerSourceType)sourceType allowsEditing:(BOOL)allowsEditing ratio:(CGFloat)ratio;

/**
 * 修复拍照图片旋转90度的问题
 */
+ (UIImage *)fixImageOrientation:(UIImage *)image;

/**
 * 压缩图片质量
 */
+ (UIImage *)compressImageQualityToImage:(UIImage *)image;

/**
 * 根据扩展名,返回文件的排序类型,图片优先
 */
+(NSUInteger)getFileTypeIndex:(NSString *)fileExtName;

@end
